#ifndef GAMEENGINE_H
#define GAMEENGINE_H

#include <vector>

#include <SDL/SDL.h>
#include <DirectLOL/gameEngine/sdlwindow.h>

#include "ToolBox/gl/ViewPoints/viewpoint.h"

#include <DirectLOL/graphicElement/graphicElement.h>

#include <DirectLOL/CollisionDetection/collision.h>

#include <DirectLOL/gameEngine/eventmanager.h>
#include <ToolBox/gl/ViewPoints/viewpoint3D.h>


/*!
 * 	\class GameEngine
 * 	\brief Représente toutes actions qui seront effectués entre chaque rafraichissement de l'image
 */

class GameEngine
{
    public :

    /*************************************************************************/
    /*                          Properties                                   */
    /*************************************************************************/

    float * lightPosition;

    SDLWindow * sdlwindow;      /*!< Fenêtre SDL */
    Projection * projection;    /*!< Projection utilisé (ortho ou perspective) */
    ViewPoint  * viewpoint;     /*!< Point de vue, ou caméra, utiliser pour se déplacer dans la scene 3D */

    std::vector<GraphicElement *> elements;     /*!< Enregistre tout les éléments graphiques de la scène */
    std::vector<Collision *> collisions;        /*!< Enregistre toutes les collisions  */

    EventManager * events;      /*!< Gère les événements (délégués) et détecte les événéments claviers/souris */

    int frameRate;      /*!< Images par seconde souhaité */
    int frameCount;     /*!< Enregistre le nombre de rafraichissement effectués depuis de le début de l'application */

    int currentTime;    /*!< Valeur temporelle actuelle */
    int lastTime;       /*!< Valeur temporelle du dernier rafraichissement de l'image	*/

    int continuer;      /*!< Tant que cette valeur est égale à 1, le programme continue son éxécution */

    Vectorf * clearColor; /*!< Couleur utilisé pour effacer la scène (correspond environ à la couleur de fond) */

    /*************************************************************************/
    /*                          Methods                                      */
    /*************************************************************************/

    GameEngine();

    /*!
     *      \fn void InitSDL(int width, int height);
     *
     *      \brief  Initialise la fenêtre de jeu, crée à l'aide de la librairie SDL
     *
     *          \param int width  : largeur de la fenêtre
     *          \param int height : hauteur de la fenêtre
     */

     void InitSDL(int width, int height);

    /*!
     *      \fn void InitGL();
     *
     *      \brief  Initialise le tout ce qui est nécéssaire (contexte/variables/constantes)
     *              à l'affichage d'un rendu OpenGL
     */

     void InitGL();

    /*!
     *      \fn void DisplayFrame();
     *
     *      \brief  Exécute la méthode Display de tous les éléments du conteneur std::vector<GraphicElement *> elements
     */

     virtual void DisplayFrame();

    /*!
     *      \fn void GameLoop()
     *
     *      \brief  Exécute toutes les méthodes nécéssaire au bon déroulement du jeu à chaque frame (rafraichissement de l'image
     */

    void GameLoop();

    void DefineProjection(Projection * aProjection);

    void AddElement(GraphicElement *);
    void AddElements(std::vector<GraphicElement *> elements);

    void DisplayPicking(void);

    void UpdatePhysic();
    void ResolveEvents();
    void UpdatePositions();
    void UpdateCollisions();

    void AddEvent(AbstractDelegate *aEvent);
    void EraseElements();
    void EraseCollision();

    int EndCollision(Collision * col);

    void DefineViewpoint(ViewPoint * aViewpoint);

};
#endif
